package com.test.file;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.test.Person;
import com.test.WordBaseInfo;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.usermodel.*;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 李玄玄
 * @date 2024年08月20日 9:27
 */
public class ReadWord {

    @Test
    public void testOne() {
        try {
            XWPFDocument document = new XWPFDocument(new FileInputStream("D:\\01依据文件1（审查标准）.docx"));
            List<XWPFParagraph> paragraphList = document.getParagraphs();
            List<String> readTextList = Lists.newArrayList();
            for (XWPFParagraph paragraph : paragraphList) {
                if (StringUtils.isNotBlank(paragraph.getText())) {
                    readTextList.add(paragraph.getText());
                    System.out.println(paragraph.getText());
                }
            }
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void testTwo() {
        try {
            FileInputStream fileInputStream = new FileInputStream("D:\\01依据文件1（审查标准）.doc");
            XWPFDocument doc = new XWPFDocument(fileInputStream);
            FileOutputStream fileOutputStream = new FileOutputStream("D:\\02依据文件1（审查标准）.docx");
            doc.write(fileOutputStream);
            fileOutputStream.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void testThree() {
        //try {
        //    Map<String, String> stringStringMap = parseWord("D:\\《xxxx》技术任务书（编制说明）-2024.docx");
        //    System.out.println(stringStringMap);
        //
        //} catch (Exception e) {
        //    e.printStackTrace();
        //}

        String filePath = "D:\\附件2.中国电气装备集团有限公司科技项目计划任务书（模板）0907.docx";

        try (FileInputStream fis = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(fis)) {

            List<XWPFTable> tables = document.getTables();
            for (int i = 0; i < tables.size(); i++) {
                XWPFTable table = tables.get(i);
                System.out.println("Table " + (i + 1) + ":");
                extractTableContent(table);
                System.out.println();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Test
    public void testFour() {
        //String filePath = "D:\\附件2.中国电气装备集团有限公司科技项目计划任务书（模板）0907.docx";  // 替换为你的Word文档路径
        //String filePath = "D:\\模板1：许继集团科技项目可行性研究报告(产品开发类).docx";
        //String filePath = "D:\\±550kV空气绝缘直流GIS0320test02.docx";
        String filePath = "D:\\附件3.中国电气装备总部科技项目可行性研究报告（模板）(1).docx";

        try {
            //File downLoadFile = HttpUtil.downloadFileFromUrl("http://120.24.64.31:9000/bucket01/067b4266fbdaba5f86410ac422d941b42de779c0968d769a33dc1ff776729592.docx", new File("附件2.中国电气装备集团有限公司科技项目计划任务书（模板）0907.docx"));
            //List<WordBaseInfo> students = extractStudentDataFromWord(downLoadFile);

            List<WordBaseInfo> students = extractStudentDataFromWord(new File(filePath));

            // 输出每个科目和单位的组合
            for (WordBaseInfo entry : students) {
                List<String> units = entry.getStr3();
                if (!units.isEmpty()) {
                    for (int i = 0; i < units.size(); i++) {
                        System.out.println(entry.getStr1() + ", " + entry.getStr4().get(i) + ", " + units.get(i) + ", " + entry.getRemark());
                    }
                } else {
                    System.out.println(entry.getStr1() + ",牵头单位, " + entry.getStr2() + ", " + entry.getRemark());
                }
            }
            //FileUtil.del(downLoadFile);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void testFive() throws IOException {
// 加载Word文档
        FileInputStream fileInputStream = new FileInputStream("D:\\±550kV空气绝缘直流GIS0320test01.docx");
//        FileInputStream fileInputStream = new FileInputStream("D:\\模板1：许继集团科技项目可行性研究报告(产品开发类).docx");
        XWPFDocument document = new XWPFDocument(fileInputStream);

        // 获取所有表格
        List<XWPFTable> tables = document.getTables();

        // 处理表格
        for (XWPFTable table : tables) {
            // 查找表头，包含下面这些列
            int nameColumnIndex = -1;
            int dobColumnIndex = -1;
            int monthNumColumnIndex = -1;
            int deptNameColumnIndex = -1;

            XWPFTableRow headerRow = table.getRow(0);  // 假设第一行为表头
            if (headerRow.getTableCells().size() >= 3) {
                for (int i = 0; i < headerRow.getTableCells().size(); i++) {
                    String cellText = headerRow.getCell(i).getText();
                    if (StrUtil.containsAny(cellText, "姓名", "人员")) {
                        nameColumnIndex = i;
                    }
                    if (cellText.contains("出生")) {
                        dobColumnIndex = i;
                    }
                    if (cellText.contains("月数")) {
                        monthNumColumnIndex = i;
                    }
                    if (cellText.contains("单位")) {
                        deptNameColumnIndex = i;
                    }
                }

                // 如果找到了“姓名”和“出生年月”列
                if (nameColumnIndex != -1 && deptNameColumnIndex != -1) {
                    // 创建一个存储结果的列表
                    List<Person> people = new ArrayList<>();

                    // 从第二行开始读取数据（假设数据从第二行开始，第一行是表头）
                    for (int i = 1; i < table.getRows().size(); i++) {
                        XWPFTableRow row = table.getRow(i);
                        Person person = new Person();

                        // 跳过第一列，只读取从第二列开始
                        if (row.getTableCells().size() > nameColumnIndex) {
                            person.setName(row.getCell(nameColumnIndex).getText());
                        }
                        if (dobColumnIndex != -1 && row.getTableCells().size() > dobColumnIndex) {
                            person.setDob(row.getCell(dobColumnIndex).getText());
                        }
                        if (monthNumColumnIndex != -1 && row.getTableCells().size() > monthNumColumnIndex) {
                            person.setMonthNum(row.getCell(monthNumColumnIndex).getText());
                        }
                        if (row.getTableCells().size() > deptNameColumnIndex) {
                            person.setDeptName(row.getCell(deptNameColumnIndex).getText());
                        }

                        people.add(person);
                    }

                    // 输出或使用 people 列表
                    for (Person person : people) {
                        System.out.println(JSONUtil.toJsonStr(person));
                    }
                }
            }
        }
    }

    public static List<WordBaseInfo> extractStudentDataFromWord(File file) throws IOException {
        List<WordBaseInfo> students = new ArrayList<>();

        try (FileInputStream fis = IoUtil.toStream(file)) {
            XWPFDocument document = new XWPFDocument(fis);

            String[] keywords = {"科目名称", "预算金额", "备注"};
            // 遍历文档中的所有表格
            for (XWPFTable table : document.getTables()) {
                if (isStudentTable(table, keywords)) {  // 如果是学生信息表
                    // 提取学生数据
                    students.addAll(extractStudentDataFromTable(table));
                }
            }
        }

        return students;
    }

    // 判断该表格是否包含学生信息
    private static boolean isStudentTable(XWPFTable table, String[] keywords) {
        // 学生信息表的关键字
        XWPFTableRow firstRow = table.getRow(0);  // 获取表格的第一行
        if (firstRow == null) {
            return false;
        }

        int i = 0 ;
        // 检查第一行的单元格是否包含“姓名”、“年龄”和“成绩”等关键字
        for (XWPFTableCell cell : firstRow.getTableCells()) {
            String cellText = cell.getText().replaceAll("\\s+", "");
            for (String keyword : keywords) {
                if (cellText.equals(keyword)) {
                    //判断表头里面的匹配项的个数等于关键字的个数，才算匹配成功
                    if(++i == keywords.length){
                        return true;
                    }
                }
            }
        }

        return false;  // 没有找到匹配的关键字，认为不是学生信息表
    }


    // 提取表格中的学生数据
    private static List<WordBaseInfo> extractStudentDataFromTable(XWPFTable table) {
        List<WordBaseInfo> students = new ArrayList<>();
        // 获取表格的表头，假设第一行包含列名
        XWPFTableRow headerRow = table.getRow(0);

        // 动态获取表头中的单位列名
        List<String> unitNames = new ArrayList<>();
        for (int i = 2; i < headerRow.getTableCells().size() - 1; i++) {
            unitNames.add(headerRow.getCell(i).getText().trim());  // 获取单位列名
        }

        /**
         * i ==1的时候，处理数据行，跳过第一行（表头）
         * table.getRows().size() - 1 表示跳过最后一行（最后一行是合计行）
         */

        for (int i = 1; i < table.getRows().size() - 1; i++) {
            XWPFTableRow row = table.getRow(i);

            String subject = row.getCell(0).getText().trim();  // 获取科目名称（第一个单元格）
            String total = row.getCell(1).getText().trim();    // 获取总数（第二个单元格）
            String remark = row.getCell(row.getTableCells().size() - 1).getText().trim();

            // 收集单位数据（从第3列开始，直到倒数第二列）
            List<String> units = new ArrayList<>();
            for (int j = 2; j < row.getTableCells().size() - 1; j++) {
                units.add(row.getCell(j).getText().trim());  // 获取各个单位数据
            }

            // 创建 TableEntry 对象并加入列表
            WordBaseInfo entry = new WordBaseInfo(subject, total, units, unitNames, remark);
            students.add(entry);
        }

        return students;

        //List<WordBaseInfo> students = new ArrayList<>();
        //
        //// 从第二行开始（假设第一行是表头）
        //for (int i = 1; i < table.getRows().size(); i++) {
        //    XWPFTableRow row = table.getRow(i);
        //    String name = row.getCell(0).getText();
        //    String age = row.getCell(1).getText();
        //    WordBaseInfo wordBaseInfo = new WordBaseInfo();
        //    wordBaseInfo.setStr1(name);
        //    wordBaseInfo.setStr2(age);
        //    students.add(wordBaseInfo);
        //}
        //
        //return students;
    }

    private static void extractTableContent(XWPFTable table) {
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {
                String cellText = cell.getText();
                System.out.print(cellText + "\t");
            }
            System.out.println();
        }
    }

    public static Map<String, String> parseWord(String filePath) throws Exception {
        Map<String, String> data = new HashMap<>();
        try (FileInputStream fis = new FileInputStream(filePath);
             XWPFDocument document = new XWPFDocument(fis)) {

            // 遍历段落（适合键值对文本）
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                String text = paragraph.getText().trim();
                if (text.contains("：")) { // 假设分隔符是中文冒号
                    String[] parts = text.split("：", 2);
                    data.put(parts[0], parts[1]);
                }
            }

            // 遍历表格（适合表格形式）
            for (XWPFTable table : document.getTables()) {
                for (XWPFTableRow row : table.getRows()) {
                    List<XWPFTableCell> cells = row.getTableCells();
                    if (cells.size() >= 2) {
                        String key = cells.get(0).getText().trim();
                        String value = cells.get(1).getText().trim();
                        data.put(key, value);
                    }
                }
            }
        }
        return data;
    }
}
